/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BUS;
import DAO.*;
//import com.sun.xml.internal.ws.message.stream.StreamAttachment;
import java.util.StringTokenizer;
import java.util.Vector;

/**
 *
 * @author Administrator
 * 
 * 
 */
/*
 * Quy trình kiểm tra cú pháp đơn giản 
 *  đầu tiên trong hàm parseQuerry gọi hàm checkQuerry trả về boolean 
 * 
 * trong hàm checkQuerry ở đây sẻ lọc ra các phần tử của câu querry và kiểm tra cú pháp có đúng 
 * cú pháp chứa nếu đả đúng hết cú pháp thì kết thúc hàm và biến syntaxQuerry vẫn giữa giá trị true
 * đòng thời kết thúc hàm này ta củng đổ đưuọc các dữ liệu cần thiết vào các mảng , vector chứa dữu liệu
 * tương ứng của từng loại câu querry .
 * Kết thúc gọi hàm checkquerry ta kiểm tra biến syntaxQuerry đả thỏa chưa nếu đả thỏa rồi ta tiến hành kiểm tra 
 * các phần tử có trong các mảng , vector chứa dữ liệu tương ứng cho từng câu truy vấn như là kiểm tra tên bảng trong 
 * from list có tồn tại ko ? , tên column trong select list có tồn tại ko 
 * nếu đả Ok hết thì tiến hành thực thi câu querry :D
 */
   
public class BUS_ParseQuerry {
     class UpdateList
    {
       public String columnsName;
        public String value;
        public int isString; // 1 la string , 2 la int , 0 la column name
        public UpdateList(String columns , String _value)
        {
            this.columnsName = columns;
            this.value = _value;
            isString = 0;
        }
    }
    
    
    //  Các Kiểu định dạng giúp nhận biết kết quả trả về từ câu querry đưa vào
    public boolean TypeSelect = false;
    public boolean TypeInsert = false;
    public boolean TypeUpdate = false;
    public boolean TypeDelete = false;
    public boolean TypeDropTable =false;
    public boolean TypeDropDataBase = false;
    public boolean TypeCreateTable =false;
    public boolean TypeCreateDataBase = false;
    
    // cú pháp querry đúng hay sai  
    public boolean syntax_Querry = false;
    
    public String[] str_All; // Mả chứa tất cả các từ trong câu querry được cắt bởi khoảng trắng
    
    public int count_Element_Querry = 0; // đếm số phần tử của câu querry được cắt ra 
    
    // Mảng các kí tự đứng đầu câu querry thể hiện chức năng
    public String [] str_Element_Function = {"select","insert","update","delete","drop","create"};
    // Mảng chứ các phần tử nằm trong cụm select
    public String [] str_Select_List;
    // Mảng chứa các phần tử nằm trong cum from 
    public String [] str_From_List;
    // Vector chứa các phần tử nằm trong cụm where 
    public Vector V_WhereList;
    // Mảng chứa các phần tử nằm trong values của câu insert
    public String [] str_valuesList;
    // Mot vector chứa các kiểu update cho câu lệnh update
    public Vector V_UpdateList;
    // Vector Columns chứa tên cột và kiểu dữ liệu của cột 
    public Vector V_Columns;
    // Mảng các phần tử đi đôi với từ khóa create đứng đầu 
    public String[] str_Create_Drop_Function = {"database","table"};
    
    
    // Biến đếm các phần tử
    public int count_Str_SelectList = 0;
    public int count_Str_FromList = 0;
    public int count_Str_whereList = 0;
    public int count_Str_ValuesList = 0;
    
    
    // Giá trị khẩng định từ khóa function thuộc giạng nào sleect  or insert ....
    int check_Function = 0;
    
    
    // Chuổi Thông báo lổi 
    public String Message_Error;
    
    
    // Các từ khóa cố định như Tên bảng ,Tên dataBase trong qua trinh su ly querry
    public String tableName ;
    public String dataBaseName;
    
    // tên của DataBase đang thao tác hiện hành cái này rất quan trọng
    public String dataBaseCurrent;
    
     DataManager dataBase_Manager;
     
     
  public  BUS_ParseQuerry(String CurentDataBase)
    {
        dataBase_Manager = new DataManager();
        dataBase_Manager.ReadDatabase();
        this.dataBaseCurrent = CurentDataBase;
        
    }
   // CÁC HÀM CƠ BẢN 
   public String[] GetList_DataBase()
   {
       return dataBase_Manager.GetList_Database();
   }
   public String[] GetList_Table(String dataBaseName)
   {
       return dataBase_Manager.GetList_Table(dataBaseName);
   }
   // Lấy danh sách cột của một bảng 
   public String[] GetList_Columns(String dataBaseName, String tableName)
   {
       return dataBase_Manager.Get_List_Column(dataBaseName, tableName);
   }
   
   
   
    // cÁC HÀM THAO TÁC TRỰC TIẾP KHÔNG DÙNG QUERRY
    
    // Phương Thúc Này Create DataBase Trực Tiếp Chỉ cần đưa vào Tên
    // DataBase 
    public boolean Create_DataBase(String dataBaseName)
    {
        return dataBase_Manager.CreateDatabase(dataBaseName);
    }
    
    // Xoa DataBase
    public boolean Drop_DataBase (String dataBaseName)
    {
        return dataBase_Manager.DropDatabase(dataBaseName);
    }
    // Thêm table vào database
    public boolean Add_Table_To_DataBase(String dataBaseName,Table table)
    {
      return dataBase_Manager.Add_Table_To_Database(dataBaseName, table);  
    }
    // Xóa Table Ra khỏi database
    public boolean Delete_Table_From_DataBase(String dataBaseName, String tableName)
    {
        return dataBase_Manager.Delete_Table(dataBaseName, tableName);
    }
    // Xóa một cột từ một bảng của một dataBase
    public boolean Delete_Columns_From_Table(String dataBaseName, String table_Name,String columnsName)
    {
        return dataBase_Manager.Delete_Column_From_Table(dataBaseName, table_Name, columnsName);
    }
    // Thêm một cột vào một table của một dataBase
    public boolean Add_Columns_To_Table(String dataBaseName,String tableName,Column columnsName)
    {
        return dataBase_Manager.Add_Column_To_Table(dataBaseName, tableName, columnsName);
    }
    // thêm columns và xóa columns update Sau 
    
    
    // CÁC HÀM SỮ LÝ DÙNG QUERRY
    
    public Object ParseQuerry(String querry)
    {
        CheckQuerry(querry);
        if(syntax_Querry)
        {
            switch(check_Function)
            {
                // Kiểm tra các thành phần câu select gồm selectList , fromList, whereList
                
                case 0:
                {
                    dataBase_Manager = null;
                    dataBase_Manager = new DataManager();
                    dataBase_Manager.ReadDatabase();
                    // từ current database ta lấy được danh sách table của database
                    String[] ListTableOfDataBase = dataBase_Manager.GetList_Table(dataBaseCurrent);
                    // Kiểm tra các table trong fromList đả đúng hay chưa 
                    boolean isTable = false;
                    for(int i = 0;i<count_Str_FromList;i++)
                    {
                        for(int j = 0;j<ListTableOfDataBase.length;j++)
                        {
                            if(str_From_List[i].equalsIgnoreCase(ListTableOfDataBase[j]))
                            {
                                isTable = true;
                                break;
                            }
                        }
                        if(isTable)
                        {
                            isTable = false;
                        }
                        else
                            // ten table nay khong chua trong danh sac table cua database
                        {
                                    syntax_Querry = false;
                                    Message_Error = " table name "+str_From_List[i]+" khong tong tai !";
                                    return syntax_Querry;
                        }
                    }
                    // Lấy danh sách columns có trong các table ở from list
                    String [] list_Columns = new String[20];
                    String [] tam;
                    int count_Columns = 0;
                    for(int i = 0;i<count_Str_FromList;i++)
                    {
                        tam = dataBase_Manager.Get_List_Column(dataBaseCurrent, str_From_List[i]);
                        for(int j = 0;j<tam.length;j++)
                        {
                            list_Columns[count_Columns] = tam[j];
                            count_Columns ++;
                        }
                    }
                    
                    // Kiem tra cac phan tu co trong where list 
                    boolean isColumns = false;
                    boolean valuesIsColumnName = true;
                   
                    for(int i = 0;i<V_WhereList.size();i++)
                    {
                        for(int j = 0;j<count_Columns;j++)
                        {
                            // Kiem tra columsn name co ton tai ko 
                            if(((UpdateList)V_WhereList.elementAt(i)).columnsName.equalsIgnoreCase(list_Columns[j]))
                            {
                                isColumns = true;
                               
                            }
                            // kiem tra value so sanh voi columns name neu no la kieu int hay varchar thi sac
                            // dinh luon o day  neu no la mot colum name thi phai kiem tra column name nay co ton 
                            // tai hay ko 
                            if(IsInt(((UpdateList)V_WhereList.elementAt(i)).value))
                            {
                                ((UpdateList)V_WhereList.elementAt(i)).isString = 2;
                                
                            }
                            if(IsString(((UpdateList)V_WhereList.elementAt(i)).value))
                            {
                                ((UpdateList)V_WhereList.elementAt(i)).isString = 1;
                                
                            }
                            if(((UpdateList)V_WhereList.elementAt(i)).isString == 0)
                            {
                                // kiem tra cot nay co nam trong danh sach cot hay ko ?
                                if(((UpdateList)V_WhereList.elementAt(i)).value.equalsIgnoreCase(list_Columns[j]))
                                {
                                    
                                }
                                else
                                {
                                    valuesIsColumnName = false;
                                    
                                }
                            }
                            
                        }
                        if(isColumns)
                        {
                            isColumns = false;
                        }
                        else
                        {
                                    syntax_Querry = false;
                                    Message_Error = " columns name "+((UpdateList)V_WhereList.elementAt(i)).columnsName+" khong tong tai !";
                                    return syntax_Querry;
                        }
                        if(!valuesIsColumnName)
                        {
                                    syntax_Querry = false;
                                    Message_Error = " columns name "+((UpdateList)V_WhereList.elementAt(i)).value+" khong tong tai !";
                                    return syntax_Querry;
                        }
                        
                        
                    }
                   
                    
                    // Kiem tra select List 
                    if((count_Str_SelectList == 1) && (str_Select_List[0].equals("*")))
                    {
                    }
                    else
                    {
                        isColumns = false;
                        for(int i=0;i<count_Str_SelectList;i++)
                        {
                            for(int j = 0;j<count_Columns;j++)
                            {
                                if(str_Select_List[i].equalsIgnoreCase(list_Columns[j]))
                                {
                                    isColumns = true;
                                    break;
                                }
                            }
                            if(isColumns)
                            {
                                isColumns = false;
                            }
                            else
                            {
                                        syntax_Querry = false;
                                        Message_Error = " column name "+str_Select_List[i]+" khong tong tai !";
                                        return syntax_Querry;
                            }
                        }
                    }
                    // Đến đây thì cú pháp querry đả OK  ta tiến hành rút dữ liệu theo yêu cầu 
                    
                    // trường hợp lấy dữ liệu từ 1 bảng 
                    if(count_Str_FromList == 1)
                    {
                        // Lay du lieu cua database do vao table tuong ung 
                        Table table_tam = dataBase_Manager.Get_Data_Table(dataBaseCurrent, str_From_List[0]);
                        Bus_Table bus_Table = new Bus_Table(table_tam.Name);
                        // tao so dong cho table 
                        for(int i = 0;i<table_tam.Colum_name[0].count_rown;i++)
                        {
                            bus_Table.AddDataRowToTable(new Bus_Row());
                        }
                        
                        for(int i = 0 ; i<table_tam.count_colum;i++)
                        {
                            for(int j = 0;j<table_tam.Colum_name[i].count_rown;j++)
                            {
                                // them du lieu vao 1 dong cua table 
                                Bus_ElementRow element = new Bus_ElementRow(table_tam.Colum_name[i].Name, table_tam.Colum_name[i].Rown[j],table_tam.Colum_name[i].Type);
                                bus_Table.tableData.elementAt(j).AddDataToRow(element);  
                            }
                        }
                        // Sau khi da co du lieu vao table ta tien hanh lay du lieu theo dieu kien where
                        
                        // duyet tat ca cac dong cua table
                        for(int i = 0;i<bus_Table.tableData.size();i++)
                        {
                            // quet qua tat ca cac cot tren dong 
                            for(int j = 0;j<bus_Table.tableData.elementAt(i).rowData.size();j++)
                            {
                                // kiem tra dieu kien trong where 
                                // duyet qua where list
                                for(int k = 0;k<V_WhereList.size();k++)
                                {
                                    // neu cot trong bang trung voi cot trong where list
                                    if(bus_Table.tableData.elementAt(i).rowData.elementAt(j).columnName.equalsIgnoreCase(((UpdateList)V_WhereList.elementAt(k)).columnsName))
                                    {
                                        // kiem tra value cua so sanh la gi
                                        switch(((UpdateList)V_WhereList.elementAt(k)).isString)
                                        {
                                            case 0:
                                            {
                                                syntax_Querry = false;
                                                Message_Error = " Loi Vi day la truong hop ket 1 bang !";
                                                return syntax_Querry;
                                            }
                                            case 1:
                                            {
                                                // kiem tra gia tri ma cot can so sanh co cung kieu du lieu ko neu ko thi thong bao loi 
                                                if(bus_Table.tableData.elementAt(i).rowData.elementAt(j).Type == false)
                                                {
                                                // value la string ta so sanh voi chuoi 
                                                // dua gia tri ve chuoi 
                                                
                                                StringTokenizer t = new StringTokenizer(((UpdateList)V_WhereList.elementAt(k)).value,"'");
                                                String str_compare = t.nextToken();
                                                // kiem tra voi gia tri cua cot hien tai 
                                                if(((String)bus_Table.tableData.elementAt(i).rowData.elementAt(j).Value).equalsIgnoreCase(str_compare))
                                                {
                                                    // dung ko lam gi het :D
                                                }
                                                // ko bang nhau => dieu kien ko thoa vay dong nay bi loai 
                                                else
                                                {
                                                    bus_Table.tableData.removeElementAt(i);
                                                    i = 0;
                                                }
                                                }
                                                // khong cung kieu du lieu thong bao loi 
                                                else
                                                {
                                                    syntax_Querry = false;
                                                    Message_Error = " Loi Khong Cung Kieu Du Lieu Tai "+bus_Table.tableData.elementAt(i).rowData.elementAt(j).columnName;
                                                    return syntax_Querry;
                                                }
                                                
                                            }
                                                break;
                                            case 2:
                                            {
                                                // kiem tra voi du lieu la kieu int
                                                if(bus_Table.tableData.elementAt(i).rowData.elementAt(j).Type == true)
                                                {
                                                    // cung kieu du lieu tien hanh kiem tra dieu kien 
                                                    try
                                                    {
                                                       int valuesColumns =  (Integer)bus_Table.tableData.elementAt(i).rowData.elementAt(j).Value;
                                                       int valuesWhere = Integer.parseInt(((UpdateList)V_WhereList.elementAt(k)).value);
                                                       if(valuesColumns == valuesWhere)
                                                       {
                                                           // thoa dieu kien where de dong nay lai 
                                                       }
                                                       // dong khong thoa dieu kine ta xoa dong nay di 
                                                       else
                                                       {
                                                           bus_Table.tableData.removeElementAt(i);
                                                           i = 0;
                                                       }
                                                    {
                                                        
                                                    }
                                                    }catch(Exception e)
                                                    {
                                                        System.out.println("Loi tai vi tri chuyen kieu du lieu thanh int de so sanh !");
                                                        System.out.println(e.getMessage());
                                                    }
                                                }
                                                // khong cung kieu du lieu thong bao loi 
                                                else
                                                {
                                                     syntax_Querry = false;
                                                    Message_Error = " Loi Khong Cung Kieu Du Lieu Tai "+bus_Table.tableData.elementAt(i).rowData.elementAt(j).columnName;
                                                    return syntax_Querry;
                                                }
                                                
                                            }
                                        }
                                    }
                                    // khong trung voi columname thi chuyen qua dieu kien khac
                                }
                            }
                        }
                        // hoan tat viec kiem tra dieu kien where du lieu tren table luc nay con 
                        // lai da thoa dieu kien where  tien hanh xuat du lieu ra 
                        
                        // kiem tra noi dung cua select va xuat cac dong tuong ung voi noi dung cua select
                        
                        // neu select la * thi tra ra table hien tai  
                        if(count_Str_SelectList == 1 && str_Select_List[0].equals("*"))
                        {
                             // tra ra table hien tai 
                            return bus_Table;
                        }
                        // luc nay chi co mot vai cot du lieu dc lay ra 
                        else
                        {
                            Bus_Table recieveTable = new Bus_Table(bus_Table.tableName);
                            // tao dong cho table moi 
                            for(int i = 0;i<bus_Table.tableData.size();i++)
                            {
                                recieveTable.AddDataRowToTable(new Bus_Row());
                            }
                            // duyet qua select list va chi lay nhung cot co trong select list ma thoi
                            for(int i = 0;i<count_Str_SelectList;i++)
                            {
                                // duyet qua tat ca cac dong cua table
                                for(int j = 0;j<bus_Table.tableData.size();j++)
                                {
                                    // duyet qua tat ca cac cot cua mot dong
                                    for(int k = 0;k<bus_Table.tableData.elementAt(j).rowData.size();k++)
                                    {
                                        if(str_Select_List[i].equalsIgnoreCase(bus_Table.tableData.elementAt(j).rowData.elementAt(k).columnName))
                                        {
                                            // neu bang nhau thi do du lieu nay vao dong tuong ung tren table moi
                                            recieveTable.tableData.elementAt(j).AddDataToRow(bus_Table.tableData.elementAt(j).rowData.elementAt(k));
                                        }
                                    }
                                }
                            }
                            // hoan tat ta co bang du lieu thoa yeu cau select 
                            return recieveTable;
                        }
                    }
                    else
                        // truong hop ket nhieu hon 2 bang  hoac 2 bang 
                    {
                          // Lay du lieu cua database do vao table tuong ung 
                        Vector<Table> V_Table_Tam = new Vector<Table>();
                        for(int i = 0;i<count_Str_FromList;i++)
                        {
                            Table t = dataBase_Manager.Get_Data_Table(dataBaseCurrent, str_From_List[i]);
                            V_Table_Tam.addElement(t);
                        }
                        // do du lieu vao bang trong bus de tien hanh ket bang 
                        Vector<Bus_Table> V_BusTable = new Vector<Bus_Table>();
                        for(int i = 0;i<V_Table_Tam.size();i++)
                        {
                            // tao moi mot table bus
                            V_BusTable.addElement(new Bus_Table(V_Table_Tam.elementAt(i).Name));
                            // add row vao cho V_Bustable thu i;
                            for(int u = 0;u<V_Table_Tam.elementAt(i).Colum_name[0].count_rown;u++)
                            {
                                V_BusTable.elementAt(i).AddDataRowToTable(new Bus_Row());
                            }
                             for(int j = 0 ; j<V_Table_Tam.elementAt(i).count_colum;j++)
                            {
                                for(int k = 0;k<V_Table_Tam.elementAt(i).Colum_name[j].count_rown;k++)
                                {
                                    // them du lieu vao 1 dong cua table 
                                    Bus_ElementRow element = new Bus_ElementRow(V_Table_Tam.elementAt(i).Colum_name[j].Name, V_Table_Tam.elementAt(i).Colum_name[j].Rown[k],V_Table_Tam.elementAt(i).Colum_name[j].Type);
                                    element.SetTableName(V_Table_Tam.elementAt(i).Name);
                                    V_BusTable.elementAt(i).tableData.elementAt(k).AddDataToRow(element);
                                }
                            }
                        }
                        
                       
                        
                        
                        // da co du lieu trong cac bang cua bus ta tien hanh tich de cac
                        Bus_Table table_Tich = new Bus_Table("tich");
                        // chi tich decac cho 2 bang 
                        // doc cac dong cua table 1
                        for(int i = 0;i<V_BusTable.elementAt(0).tableData.size();i++)
                        {
                                Bus_Row row = new Bus_Row();
                                // tien hanh dua dong thu i cua table 1 vao table_tich
                                for(int j = 0;j<V_BusTable.elementAt(0).tableData.elementAt(i).rowData.size();j++)
                                {
                                    row.AddDataToRow(V_BusTable.elementAt(0).tableData.elementAt(i).rowData.elementAt(j));
                                }
                                // tiep tuc dua cac dong cua table 2 vao dong hien tai va add vao table tich
                                
                                for(int k = 0;k<V_BusTable.elementAt(1).tableData.size();k++)
                                {
                                    // duyet qua cac cot cua tung dong
                                    Bus_Row newRow = new Bus_Row();
                                    newRow.CoPy(row);
                                    for(int l = 0;l<V_BusTable.elementAt(1).tableData.elementAt(k).rowData.size();l++)
                                    {
                                        // do vao row lay tu table 1
                                        newRow.rowData.addElement(V_BusTable.elementAt(1).tableData.elementAt(k).rowData.elementAt(l));
                                    }
                                    // hoan tat dc 1 dong gom co dong 1 cua table 1 va dong thu k cua table 2 
                                    // dua dong nay vao table tich
                                    table_Tich.AddDataRowToTable(newRow);
                                    
                                }
                                
                                
                            }
                        
                        
                        // hoan tat ta co dc 1 table la tich decac cua 2 bang 1 va 2 cau from list
                         
                        // tien hanh loc du lieu theo dieu kien where 
                        
                        // duyet qua tat ca cac dong cua table tich
                        for(int i = 0;i<table_Tich.tableData.size();i++)
                        {
                            // duyet qua tung cot cua tung dong
                            for(int j = 0;j<table_Tich.tableData.elementAt(i).rowData.size();j++)
                            {
                                // duyet qua tung cot trong where list
                                if(V_WhereList.size() > 0)
                                {
                                for(int k =0;k<V_WhereList.size();k++)
                                {
                                    if(table_Tich.tableData.elementAt(i).rowData.elementAt(j).columnName.equalsIgnoreCase(((UpdateList)V_WhereList.elementAt(k)).columnsName))
                                    {
                                    // bat dau kiem tra cac truong hop so sanh
                                    switch(((UpdateList)V_WhereList.elementAt(k)).isString)
                                    {
                                        // So sanh voi mot cot 
                                        case 0 :
                                        {
                                            String table_left , table_right , columnLeft,columnRight;
                                            // lay ten bang ben trai 
                                            StringTokenizer t = new StringTokenizer(((UpdateList)V_WhereList.elementAt(k)).columnsName,".");
                                            table_left = t.nextToken();
                                            columnLeft = t.nextToken();
                                            // lay ten  bang ben phai 
                                            t = new StringTokenizer(((UpdateList)V_WhereList.elementAt(k)).value , ".");
                                            table_right = t.nextToken();
                                            columnRight = t.nextToken();
                                            
                                            Bus_ElementRow elementLeft = new Bus_ElementRow();
                                            Bus_ElementRow elemnetRight = new Bus_ElementRow();
                                            // duyet qua tung cot cua dong i de kiem tra thuoc tinh 2 cot
                                            for(int l = 0;l<table_Tich.tableData.elementAt(i).rowData.size();l++)
                                            {
                                                // lay cac phan tu do vao elementleft va elementRight
                                                if(table_Tich.tableData.elementAt(i).rowData.elementAt(l).tableName.equalsIgnoreCase(table_left) && table_Tich.tableData.elementAt(i).rowData.elementAt(l).columnName.equalsIgnoreCase(columnLeft))
                                                {
                                                    elementLeft = table_Tich.tableData.elementAt(i).rowData.elementAt(l);
                                                }
                                                if(table_Tich.tableData.elementAt(i).rowData.elementAt(l).tableName.equalsIgnoreCase(table_right) && table_Tich.tableData.elementAt(i).rowData.elementAt(l).columnName.equalsIgnoreCase(columnRight))
                                                {
                                                    elemnetRight = table_Tich.tableData.elementAt(i).rowData.elementAt(l);
                                                }
                                                
                                            }
                                            // hoan tat ta co dc 2 cot can so sanh chua trong elementleft va element right
                                            
                                            // kiem tra kieu du lieu cua 2 cot new khac kieu du lieu thong bao loi 
                                            if(elementLeft.Type == elemnetRight.Type)
                                            {
                                                // cung kieu du tieu tien hanh so sanh gia tri neu bang nhau khong su ly
                                                // khac nhau thi remove dong hien tai
                                                if(elementLeft.Value.equals(elemnetRight.Value))
                                                {
                                                    // dung ko su ly :D
                                                }
                                                // khong cung kieu du lieu xoa dong tuong ung
                                                else
                                                {
                                                    table_Tich.tableData.removeElementAt(i);
                                                    i = 0;
                                                }
                                            }
                                            // khong cung kieu du lieu nen thong bao loi 
                                            else
                                            {
                                                   syntax_Querry = false;
                                                   Message_Error = "Khong cung kieu du lieu giua cot " + elementLeft.columnName + " va cot  "+elemnetRight.columnName;
                                                   return syntax_Querry;
                                            }
                                            
                                            
                                        }
                                            break;
                                            // so sanh voi kieu chuoi
                                        case 1:
                                        {
                                            // tim cot co cung ten voi cot ben ve trai cua menh de where
                                            
                                            
                                             // kiem tra gia tri ma cot can so sanh co cung kieu du lieu ko neu ko thi thong bao loi 
                                                if(table_Tich.tableData.elementAt(i).rowData.elementAt(j).Type == false)
                                                {
                                                // value la string ta so sanh voi chuoi 
                                                // dua gia tri ve chuoi 
                                                
                                                StringTokenizer t = new StringTokenizer(((UpdateList)V_WhereList.elementAt(k)).value,"'");
                                                String str_compare = t.nextToken();
                                                // kiem tra voi gia tri cua cot hien tai 
                                                if(((String)table_Tich.tableData.elementAt(i).rowData.elementAt(j).Value).equalsIgnoreCase(str_compare))
                                                {
                                                    // dung ko lam gi het :D
                                                }
                                                // ko bang nhau => dieu kien ko thoa vay dong nay bi loai 
                                                else
                                                {
                                                    table_Tich.tableData.removeElementAt(i);
                                                    i = 0;
                                                }
                                                }
                                                // khong cung kieu du lieu thong bao loi 
                                                else
                                                {
                                                    syntax_Querry = false;
                                                    Message_Error = " Loi Khong Cung Kieu Du Lieu Tai "+table_Tich.tableData.elementAt(i).rowData.elementAt(j).columnName;
                                                    return syntax_Querry;
                                                }
                                            
                                        }
                                            break;
                                            // so sanh voi kieu int
                                        case 2 :
                                        {
                                              // kiem tra voi du lieu la kieu int
                                                if(table_Tich.tableData.elementAt(i).rowData.elementAt(j).Type == true)
                                                {
                                                    // cung kieu du lieu tien hanh kiem tra dieu kien 
                                                    try
                                                    {
                                                       int valuesColumns =  (Integer)table_Tich.tableData.elementAt(i).rowData.elementAt(j).Value;
                                                       int valuesWhere = Integer.parseInt(((UpdateList)V_WhereList.elementAt(k)).value);
                                                       if(valuesColumns == valuesWhere)
                                                       {
                                                           // thoa dieu kien where de dong nay lai 
                                                       }
                                                       // dong khong thoa dieu kine ta xoa dong nay di 
                                                       else
                                                       {
                                                           table_Tich.tableData.removeElementAt(i);
                                                           i = 0;
                                                       }
                                                    {
                                                        
                                                    }
                                                    }catch(Exception e)
                                                    {
                                                        System.out.println("Loi tai vi tri chuyen kieu du lieu thanh int de so sanh !");
                                                        System.out.println(e.getMessage());
                                                    }
                                                }
                                                // khong cung kieu du lieu thong bao loi 
                                                else
                                                {
                                                     syntax_Querry = false;
                                                    Message_Error = " Loi Khong Cung Kieu Du Lieu Tai "+table_Tich.tableData.elementAt(i).rowData.elementAt(j).columnName;
                                                    return syntax_Querry;
                                                }
                                        }
                                            break;
                                        }
                                    }
                                }
                              }
                            }   // het cac cot trong 1 dong
                         
                        }// het cac dong trong bang tich
                        
                        // den day ta da co bang du lieu voi cac dong du lieu thoa voi dieu kien where 
                        
                        // lcc cac cot theo dieu kien cua select de tra ket qua 
                         // neu select la * thi tra ra table hien tai  
                        if(count_Str_SelectList == 1 && str_Select_List[0].equals("*"))
                        {
                             // tra ra table hien tai 
                            return table_Tich;
                        }
                        // luc nay chi co mot vai cot du lieu dc lay ra 
                        else
                        {
                            Bus_Table recieveTable = new Bus_Table(table_Tich.tableName);
                            // tao dong cho table moi 
                            for(int i = 0;i<table_Tich.tableData.size();i++)
                            {
                                recieveTable.AddDataRowToTable(new Bus_Row());
                            }
                            // duyet qua select list va chi lay nhung cot co trong select list ma thoi
                            for(int i = 0;i<count_Str_SelectList;i++)
                            {
                                // duyet qua tat ca cac dong cua table
                                for(int j = 0;j<table_Tich.tableData.size();j++)
                                {
                                    // duyet qua tat ca cac cot cua mot dong
                                    for(int k = 0;k<table_Tich.tableData.elementAt(j).rowData.size();k++)
                                    
                                    {
                                        // neu cot trong table tuong ung voi cot trong select list thi dua cot do vao 
                                        // table ket qua tra ve .
                                        if(str_Select_List[i].equalsIgnoreCase(table_Tich.tableData.elementAt(j).rowData.elementAt(k).columnName))
                                        {
                                            // neu bang nhau thi do du lieu nay vao dong tuong ung tren table moi
                                            recieveTable.tableData.elementAt(j).AddDataToRow(table_Tich.tableData.elementAt(j).rowData.elementAt(k));
                                        }
                                    }
                                }
                            }
                            // hoan tat ta co bang du lieu thoa yeu cau select 
                            return recieveTable;
                        }
                    }
                    
                }
            }
        }
           syntax_Querry = false;
           Message_Error = "Loi cu phap dau do :D  ";
           return syntax_Querry;
        
    }
    
    // Hàm kiểm tra cú pháp querry có đúng ko ?
    public boolean CheckQuerry (String querry)
    {
        str_All = new String[100];
        StringTokenizer str_token = new StringTokenizer(querry," ");
        while(str_token.hasMoreTokens())
        {
            str_All[count_Element_Querry] = str_token.nextToken();
            count_Element_Querry ++;
        }
        
        str_All[count_Element_Querry] = " ";
        count_Element_Querry ++;
        
        // tiến hành check querry 
        
        // kiểm tra phần tử đầu tiên có thuộc vào danh sách các từ khóa có thể sữ lý ko ?
        for(int i = 0;i<str_Element_Function.length;i++)
        {
            if(str_All[0].equalsIgnoreCase(str_Element_Function[i]))
            {
                syntax_Querry = true;
                check_Function = i;
                break;
            }
        }
        // Tiến hành kiểm tra cú pháp tương ứng với từng dạng từ khóa chức năng
        
        if(syntax_Querry)
        {
            switch(check_Function)
            {
                // Sữ lý đối với từ khóa select
                case 0 : 
                {
                    TypeSelect = true;
                    boolean selectlist = true;
                    boolean fromList = false;
                    boolean whereList = false;
                    str_Select_List = new String[10];
                    str_From_List = new String[10];
                    V_WhereList = new Vector();
                    
                    for(int i = 1;i<count_Element_Querry;i++)
                    {
                        // kiểm tra để đưa các phần tử tương ứng vào select list
                        if(selectlist)
                        {
                            // kiểm tra nếu phần tử là dấu ',' thì nếu phần tử đướng trước nó là slect hoặc phần 
                            // tử đứng sau nó là from thì cú pháp bị sai 
                            if(str_All[i].equals(","))
                            {
                                if(str_All[i-1].equalsIgnoreCase("select") || str_All[i+1].equalsIgnoreCase("from" ) )
                                {
                                    syntax_Querry = false;
                                    Message_Error = "Dau  ',' phai nam giua hai thuoc tinh colums hoac hai table name ";
                                    return syntax_Querry;
                                }
                            }
                            // nếu phần tử thứ i là from thì gán biến select lít = false , from lít  = true
                            else if (str_All[i].equalsIgnoreCase("from") )
                            {
                                selectlist = false;
                                fromList = true;
                            }
                            // thêm phần tử vào select list và tăng biến đếm lên 1
                            else
                            {
                              
                                    str_Select_List[count_Str_SelectList] = str_All[i];
                                    count_Str_SelectList ++;
                                
                            }
                        }
                        // đưa các phần tử vào from list
                        else if(fromList)
                        {
                            // nếu phần tử là dấu ',' thì kiểm tra phần tử trước nó và sau nó để xen có xuất hiện lổi ko ?
                            if(str_All[i].equals(","))
                            {
                                if(str_All[i-1].equalsIgnoreCase("from") || str_All[i+1].equalsIgnoreCase("where"))
                                {
                                    syntax_Querry = false;
                                    Message_Error = "dau ',' phai nam giua 2 table";
                                    return syntax_Querry;
                                }
                            }
                            // nếu phần tử tiếp theo là where thì kết thúc from list và bắt đầu where list
                            else if(str_All[i].equalsIgnoreCase("where"))
                            {
                                fromList = false;
                                whereList = true;
                            }
                            // Nếu không rơi vào 2 trường hợp trên thì ta đưa phần tử vào from list
                            else 
                            {
                                  // neu phan tu la khoang trang thi ko them vao from list
                                if(str_All[i].equals(" "))
                                {
                                    
                                }
                                else
                                {
                                 str_From_List[count_Str_FromList] = str_All[i];
                                 count_Str_FromList ++;
                                }
                            }
                        }
                        // lấy cac phần tử vào where list 
                        else if(whereList)
                        {
                            // Nếu phần tử hiện tại là dấu = thì kiểm tra phần tử trước đó và phần tử sau nó
                            // nếu là where nằm trước hoặc khoảng trắng nằm sau thì báo sai cú pháp
                            if(str_All[i].equals("="))
                            {
                                if(str_All[i-1].equalsIgnoreCase("where") || str_All[i].equals(" "))
                                {
                                    syntax_Querry = false;
                                    Message_Error = "Dau '=' phai nam giua 2 gia tri can so sanh";
                                    return syntax_Querry;
                                }
                                // không sai cú pháp thì thêm kí tự này vào 
                                else
                                {
                                    UpdateList update = new UpdateList(str_All[i-1], str_All[i+1]);
                                    V_WhereList.addElement(update);
                                    i = i+1;
                                }
                            }
                            
                        }
                    }
                }
                    break;
                    // Sữ lý cho câu lệnh insert
                case 1:
                {
                    TypeInsert = true;
                    // kiểm tra phần tử tiếp theo có phải là into ko ?
                    // nếu phải thì tiến hành thêm tên bảng
                    
                    str_valuesList = new String[10];
                    if(str_All[1].equalsIgnoreCase("into"))
                    {
                        // tên của table chính là phần tử thứ 2
                        tableName = str_All[2];
                        // nếu sau tên table là values thì tiếp theo không thì thông báo lổi
                        if(str_All[3].equalsIgnoreCase("values"))
                        {
                            // nếu sau values là dấu  '{' thì tiếp theo không thì thông báo lổi
                            if(str_All[4].equalsIgnoreCase("{"))
                            {
                                // đổ các values vào danh sách value
                                for(int i = 5;i<count_Element_Querry -1 ;i++)
                                {
                                    str_valuesList[count_Str_ValuesList] = str_All[i];
                                    count_Str_ValuesList ++;
                                }
                                // nếu phần tử cuối cùng là '}' thì OK không thì thông báo lổi
                                if(str_All[count_Element_Querry-1].equals("}"))
                                {
                                    
                                }
                                else
                                {
                                    syntax_Querry = false;
                                    Message_Error = "khong thay dau '}'";
                                    return syntax_Querry;
                                }
                            }
                            else
                            {
                                 syntax_Querry = false;
                            Message_Error = "khong thay dau '{' sau chu value";
                            return syntax_Querry;
                            }
                        }
                        else 
                        {
                            syntax_Querry = false;
                            Message_Error = "Vi tri values khong dung";
                            return syntax_Querry;
                        }
                    }
                    // không đúng cú pháp thông báo lổi 
                    else
                    {
                        syntax_Querry = false;
                        Message_Error = "khong dung cu phap sau insert phai la into ";
                        return syntax_Querry;
                    }
                }
                    break;
                    // Sử lý Update 
                case 2:
                {
                    TypeUpdate = true;
                    boolean updateList = true;
                    boolean whereList = false;
                    V_UpdateList = new Vector();
                    V_WhereList = new Vector();
                    
                    tableName = str_All[1];
                    // nếu theo sau table là chử set thì tiếp tục còn không phải thì báo lổi
                    if(str_All[2].equalsIgnoreCase("set"))
                    {
                        // tiến hành lấy các phần tử vào trong vector updateList
                        for(int i = 3;i<count_Element_Querry;i++)
                        {
                            if(updateList)
                            {
                                //Kiểm tra kí tự nếu là dấu ',' thì kiểm tra trước nó là set hoặc sau nó là where thì báo lổi
                              if(str_All[i].equals(","))
                              {
                                  if(str_All[i-1].equalsIgnoreCase("set") || str_All[i+1].equalsIgnoreCase("where"))
                                  {
                                        syntax_Querry = false;
                                        Message_Error = "dau ',' ko duoc nam ngay sau set hoac nam lien truoc where ";
                                        return syntax_Querry;
                                  }
                              }
                              // nếu phần tử hiện tại là dấu '=' thì kiểm tra sem trước nó là where hoac là dau ',' 
                              // hoặc sau nó là dấu ',' thì báo lổi còn không thì thêm các phần tử vào 
                              else if (str_All[i].equals("="))
                              {
                                  // kiem tra phan tu truoc dau '=' va sau dau '='
                                  if(str_All[i-1].equals("where") || str_All[i-1].equals(",") || str_All[i+1].equals(",") || str_All[i+1].equals(" "))
                                  {
                                        syntax_Querry = false;
                                        Message_Error = "dau '=' phai nam giua mot columns name va mot gia tri hoac colums name";
                                        return syntax_Querry;
                                  }
                                  // Thỏa điều kiện của dấu '=' ta tiến hành thêm vào update list
                                  else
                                  {
                                      UpdateList update = new UpdateList(str_All[i-1], str_All[i+1]);
                                      V_UpdateList.addElement(update);
                                      i = i+1;
                                  }
                              }
                              else if (str_All[i].equalsIgnoreCase("where"))
                              {
                                  updateList = false;
                                  whereList = true;
                              }
                            }
                            else if (whereList)
                            {

                                      // Nếu phần tử hiện tại là dấu = thì kiểm tra phần tử trước đó và phần tử sau nó
                                // nếu là where nằm trước hoặc khoảng trắng nằm sau thì báo sai cú pháp
                                if(str_All[i].equals("="))
                                {
                                    if(str_All[i-1].equalsIgnoreCase("where") || str_All[i].equals(" "))
                                    {
                                        syntax_Querry = false;
                                        Message_Error = "Dau '=' phai nam giua 2 gia tri can so sanh";
                                        return syntax_Querry;
                                    }
                                    // không sai cú pháp thì thêm kí tự này vào 
                                    else
                                    {
                                        UpdateList update = new UpdateList(str_All[i-1], str_All[i+1]);
                                        i = i+1;
                                    }
                                }
                            
                            }
                        }
                    }
                    else
                    {
                        syntax_Querry = false;
                        Message_Error = "Khong thay tu set  ";
                        return syntax_Querry;
                    }
                }
                    break;
                    // Sữ lý với câu delete
                case 3:
                {
                    TypeDelete = true;
                    V_WhereList = new Vector();
                    tableName = str_All[1];
                    if(str_All[2].equalsIgnoreCase("where"))
                    {
                        // tien hanh lay cac phan tu vao trong wherelist
                        for(int i = 3;i<count_Element_Querry;i++)
                        {
                            if(str_All[i].equals("="))
                            {
                                // kiểm tra phần tử trước dấu '=' và sau dấu '='
                                if(str_All[i-1].equalsIgnoreCase("Where") || str_All[i+1].equals(" "))
                                {
                                    syntax_Querry = false;
                                    Message_Error = "Dau '=' phai nam giua 2 colums name hoac 1 columns name va 1 gia tri  ";
                                    return syntax_Querry;
                                }
                                // Thỏa điều kiện của dấu '='
                                else
                                {
                                    UpdateList update = new UpdateList(str_All[i-1], str_All[i+1]);
                                    V_UpdateList.addElement(update);
                                    i = i+1;
                                }
                            }
                        }
                    }
                    else
                    {
                         syntax_Querry = false;
                        Message_Error = "Where phai nam ngay sau table name ";
                        return syntax_Querry;
                    }
                }
                    break;
                    // Sữ lý cấu Drop
                case 4:
                {
                    
                    if(str_All[1].equalsIgnoreCase("table"))
                    {
                        TypeDropTable = true;
                        tableName = str_All[2];
                        if(count_Element_Querry > 4)
                        {
                            syntax_Querry = false;
                            Message_Error = " Moi lan chi xoa 1 table  ";
                            return syntax_Querry;
                        }
                    }
                    else if (str_All[1].equalsIgnoreCase("database"))
                    {
                        TypeDropDataBase = true;
                        dataBaseName = str_All[2];
                         if(count_Element_Querry > 4)
                        {
                            syntax_Querry = false;
                            Message_Error = " Moi lan chi xoa 1 database  ";
                            return syntax_Querry;
                        }
                    }
                    else
                    {
                            syntax_Querry = false;
                            Message_Error = " Sau drop phai la table hoac la database ";
                            return syntax_Querry;
                    }
                       
                }
                    break;
                    // Su ly cau lenh create
                case 5:
                {
                    // su ly voi cau lenh create table
                    if(str_All[1].equalsIgnoreCase("table"))
                    {
                        V_Columns = new Vector();
                        TypeCreateTable = true;
                        // phần tử tiếp theo là tên của table
                        tableName = str_All[2];
                        if(str_All[3].equals("("))
                        {
                            // nhập các cột và kiểu dữ liệu cột vào để lư trử
                            for(int i = 4;i<count_Element_Querry-1;i++)
                            {
                                // kiểm tra dấu ',' yêu cầu liền trước dấu ',' thì liền trước nó 
                                // không được là dấu '(' và liền sau nó ko được là dấu ')'
                                if(str_All[i].equals(","))
                                {
                                    if(str_All[i-1].equals("(") || str_All[i+1].equals(")"))
                                    {
                                        syntax_Querry = false;
                                        Message_Error = " Dau ',' dung de ngan cach 2 columns voi nhau";
                                        return syntax_Querry;
                                    }
                                    // lấy cột và kiểu dữ liệu của cột cho vào vector columsn
                                    else
                                    {
                                      
                                        // lay phần tử sau dấu ','
                                        UpdateList update = new UpdateList(str_All[i+1], str_All[i+2]);
                                        V_Columns.addElement(update);
                                        i = i+2;
                                    }
                                }
                                // khong phai la dau phay thi ta cu lay vao binh thuong 
                                else
                                {
                                    UpdateList update = new UpdateList(str_All[i], str_All[i+1]);
                                    V_Columns.addElement(update);
                                    i = i+1;
                                }
                            }
                            // phần tử cuối cùng phải là dấu ')' không phải thì thông báo lổi
                            if(str_All[count_Element_Querry-1].equals(")"))
                            {
                                
                            }
                            else
                            {
                                        syntax_Querry = false;
                                        Message_Error = " khong thay  Dau ')' dung de ket thuc cau lenh  tao bang ";
                                        return syntax_Querry;
                            }
                        }
                    }
                    // Sữ lý với câu lệnh create database.
                    else if (str_All[1].equalsIgnoreCase("database"))
                    {
                        TypeCreateDataBase = true;
                        dataBaseName = str_All[2];
                          if(count_Element_Querry > 4)
                        {
                            syntax_Querry = false;
                            Message_Error = " Moi lan chi Create 1 database   ";
                            return syntax_Querry;
                        }
                    }
                    else
                    {
                            syntax_Querry = false;
                            Message_Error = " Sau create phai la table hoac la database ";
                            return syntax_Querry;
                    }
                    
                }
                    break;
            }
            syntax_Querry = true;
            return syntax_Querry;
        }
        else return syntax_Querry;
       
    }
    public boolean IsString(String str)
    {
       // ki tu ' = 39
        if(str.charAt(0) == 39)
        {
            return true;
        }
        else
        return false;
        
    }
    public boolean IsInt(String str)
    {
        
        try
        {
            int t = Integer.parseInt(str);
            return true;
        }catch(Exception ex)
        {
            return false;
        }
    }
    
    
}

